package de.preisrobot.business.parser.idealo;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Date;
import java.util.List;

import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import net.htmlparser.jericho.TextExtractor;

import org.apache.log4j.Logger;

import de.preiscrawler.AlleAnbieter;
import de.preisrobot.business.parser.AbstractParser;
import de.preisrobot.entity.Artikel;
import de.preisrobot.service.internal.PreisRobotParserException;

/**
 * 
 * @author dhein
 * 
 *         Content in
 *         <tr class="listBGdark">
 *         </tr>
 *         <tr class="listBGlight">
 *         </tr>
 *         <tr class="listBGdark">
 */
public class IdealoParser extends AbstractParser
{

   private Logger log = Logger.getLogger(IdealoParser.class);

   public void parseStream(List<Artikel> list, InputStream in) throws IOException, PreisRobotParserException
   {
      Source source = new Source(in);
      parserSource(list, source);
   }

   private void parserSource(List<Artikel> list, Source source) throws PreisRobotParserException
   {
      List<Element> elementList = source.getAllElementsByClass("listBGdark");
      List<Element> elementList2 = source.getAllElementsByClass("listBGlight");

      if (elementList == null || elementList.size() == 0)
         throw new PreisRobotParserException();

      elementList.addAll(elementList2);

      for (Element element : elementList)
      {

         try
         {

            Artikel artikel = getContent(element);
            list.add(artikel);

         }
         catch (Exception e)
         {

            log.info(" ungueltiges Element " + element.getName() + " reason:" + e.getMessage());

         }

      }
   }

   private Artikel getContent(Element element)
   {

      Artikel artikel = new Artikel();

      List<Element> allElementsByClass = element.getAllElementsByClass("osimg");
      List<Element> allStartTags = element.getAllElements("td");

      String preis = getPreis(element);
      String beschreibung = getProductDescription(allStartTags);
      String imagelink = null;
      String beschreibungkurz = null;

      for (Element element2 : allElementsByClass)
      {

         imagelink = element2.getAttributeValue("src");
         beschreibungkurz = element2.getAttributeValue("alt");
      }

      artikel.setPreis(preis);
      artikel.setArtikelNr(beschreibungkurz);
      artikel.setImageLink(imagelink);
      artikel.setCreationDate(new Date());
      artikel.setAnbieterId(AlleAnbieter.IDEALO);
      artikel.setDesc(beschreibung);

      return artikel;
   }

   private String getProductDescription(List<Element> allStartTags)
   {

      String beschreibung = null;

      if (allStartTags != null && allStartTags.size() > 2) // es ist das 2. td
      // tag
      {
         Element startTag = allStartTags.get(1);
         TextExtractor textExtractor = startTag.getTextExtractor();
         beschreibung = textExtractor.toString();
      }
      return beschreibung;
   }

   private String getPreis(Element element)
   {

      List<Element> allElementsByClass = element.getAllElementsByClass("nobr");

      for (Element element2 : allElementsByClass)
      {

         String string = element2.getTextExtractor().toString();

         if (string != null && string.contains("euro"))
            return string;

      }

      return null;
   }

   @Override
   public int getAnbieter()
   {
      return AlleAnbieter.IDEALO;
   }

   @Override
   public void parseStream(List<Artikel> list, Reader in) throws IOException, PreisRobotParserException
   {
      Source source = new Source(in);
      parserSource(list, source);
   }

}
